Introducción a R

Crear código en R, uso colaborativo y reproducible

Bienvenidxs!!

¿Quiénes somos?
¿En qué punto estamos?
¿Dónde queremos llegar?

Organización del curso

Por día

Lunes = introducción a R, crear código, buenas prácticas
Martes = manejo y visualizacion de datos
Miércoles = modelos lineales y factoriales
Jueves = modelos generalizados y multivariantes
Viernes = uso colaborativo, dudas, ejemplos

Por hora

  • 9:30 a 10:30 teoría
  • 10:30 a 11:15 ejercicios
  • 11:15 a 11:30 break
  • 11:30 a 12:30 teoría
  • 12:30 a 13:30 ejercicios y dudas

Hoy

  • Introducción, código básico
  • Ejercicios I
  • Funciones, bucles, dataframes
  • Ejercicios II y III

Lo que vas a aprender:

  • Mejorar la comprensión y la práctica estadística.

  • Desarrollar habilidades en programación en R.

  • Aprender flujos de trabajo eficientes, limpios y reproducibles.

  • Saber buscar información

  • No enredarse en errores

Lo que no vas a aprender:

  • A programar en plan pro sin mirar internet o chatgpt

  • A hacer páginas web

  • A dejar de pelearte con la estadística

  • R es siempre woRk in progRess

Llenos y vacíos de conocimiento

WordCloud de la encuesta de este curso

Introducción

R es un lenguaje y entorno de programación especializado en:

  • Análisis estadístico, visualización de datos y ciencia de datos.
  • Es utilizado por investigadores, analistas y científicos para explorar, modelar y comunicar información basada en datos de forma eficiente y reproducible.
  • Muy utilizado en biología

Biólogxs en general

R y RStudio

R → Es el lenguaje de programación y el motor que realiza los cálculos estadísticos y el análisis de datos.

RStudio → Es un entorno de desarrollo integrado (un “programa”) que facilita el uso de R con una interfaz amigable, con paneles, autocompletado y herramientas visuales.

Ejemplo mesa de trabajo en R studio

¿Qué puede hacer R?

  • Calcular y analizar (operaciones matemáticas, modelos, simulaciones, tests)
  • Trabajar con datos (leer y escribir tablas, limpiar datos, transformar datos)
  • Visualizar (graficos estadísticos, interactivos, mapas, animaciones, etc)
  • Automatizar y extender (crear funciones propias, desarrollar paquetes, reproducir analisis facilmente)
  • Comunicar (crear informes Quarto o RMarkdown, crear webs o apps Shiny)

Ejemplo quarto

Lo básico, básico de R

Operaciones aritméticas

📠 Se hacen operaciones aritméticas (como una calculadora): multiplicar, dividir, sumar, restar…
por cierto, utilizamos la almohadilla # para silenciar o para comentar

2 + 3 # suma
[1] 5
10 - 4 # resta
[1] 6
3 * 5 # multiplicación
[1] 15
20 / 4 # división
[1] 5
4 %% 2 # módulo (resto de una división)
[1] 0
2 ^ 4   # Potencias
[1] 16

Operaciones básicas de lógica

Las operaciones lógicas comparan valores y devuelven un resultado booleano (lógico)
TRUE o FALSE

20 / 4 >= 10    # ¿5 es mayor o igual que 10? 
[1] FALSE
20 / 4 == 10    # ¿5 es igual a 10?
[1] FALSE
20 / 4 < 10     # ¿5 es menor que 10? 
[1] TRUE

TRUE se comporta como 1 y FALSE como 0.
Se pueden usar en cálculos.

valores <- c (TRUE, FALSE, TRUE, TRUE)
sum(valores)       # cuenta cuántos TRUE hay
[1] 3
mean(valores)      # proporción de TRUE
[1] 0.75

Acumular información

La magia de los objetos Indicamos un objeto con “<-”

x <- 10    
y <- 5
suma <- x + y
suma
[1] 15
suma + 7
[1] 22

Espera, pero ¿qué son los objetos?

  • Son un poco “cualquier cosa”
  • Tienen que empezar por una letra

Tipos de objetos

Hay muchos tipos de objetos

  • vectores, strings, matrices, tablas, listas…
  • modelos, polígonos, funciones, mapas…
numero <- 1:10
numero
 [1]  1  2  3  4  5  6  7  8  9 10
caracter <- "del uno al diez"
caracter
[1] "del uno al diez"
una_lista <- list(0:10, 10:20, 20:30)
una_lista
[[1]]
 [1]  0  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1] 10 11 12 13 14 15 16 17 18 19 20

[[3]]
 [1] 20 21 22 23 24 25 26 27 28 29 30

Podemos transformar objetos de un tipo a otro

Cambiar de un tipo a otro con as.factor(), as.numeric(), as.character()

numeros_como_caracteres <- as.character(numero)
numeros_como_caracteres
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
numeros <- as.numeric(numeros_como_caracteres)
numeros
 [1]  1  2  3  4  5  6  7  8  9 10

Ya iremos viendo más ejemplos…

Vectores

Vectores (‘array’) son elementos del mismo tipo juntos: - Una secuencia de números - Una secuencia de nombres de especies

# un vector de cinco números 
numeros <- c(1, 2, 3, 4, 6) 
numeros
[1] 1 2 3 4 6
# un vector del 1 al 40
otros_numeros <- 1:40
otros_numeros
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Operaciones con vectores

# sumamos un mismo valor a cada uno de los elementos del vector
otros_numeros + 10
 [1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
[26] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Ejercicio vectores

Genera de dos maneras distintas un vector de números que vayan del 1 al 10

Resolvemos

Genera de dos maneras distintas un vector de números que vayan del 1 al 10

# Consecutivos 
1:10
 [1]  1  2  3  4  5  6  7  8  9 10
# Combinando 
c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
 [1]  1  2  3  4  5  6  7  8  9 10
# Generador de secuencias: del 0 al 10 cada 1 
seq(1, 10, 1)
 [1]  1  2  3  4  5  6  7  8  9 10

Operaciones con vectores

Se pueden hacer medias, multiplicaciones de objetos, seleccionar parte de un vector, etc

numeros
[1] 1 2 3 4 6
promedio <- mean(numeros)
promedio
[1] 3.2
promedio * numeros
[1]  3.2  6.4  9.6 12.8 19.2
promedio / numeros
[1] 3.2000000 1.6000000 1.0666667 0.8000000 0.5333333
# [ ] para seleccionar partes de un vector
(numeros / otros_numeros)[7]
[1] 0.2857143
(numeros / otros_numeros)[7:9] 
[1] 0.2857143 0.3750000 0.4444444

Funciones básicas y útiles

Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.

Hay funciones ya de base de R (baseR) o en los paquetes ya creados por los usuarios (e.g. paquete dplyr)

Funciones básicas y útiles

Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.

R base

# c () combinar
x <- c(4, 6, 8, 3, 9, 12, 12)

# Estadísticos básicos
mean(x)       # media
[1] 7.714286
median(x)     # mediana
[1] 8
sd(x)         # desviación estándar
[1] 3.59232
min(x)        # valor mínimo
[1] 3
max(x)        # valor máximo
[1] 12
range(x)      # rango (min, max)
[1]  3 12
summary(x)    # resumen general
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.000   5.000   8.000   7.714  10.500  12.000 

Ayuda

Ayuda para funciones en R (o también vale buscar en google “function mean in R”)

# Ayudas
?mean           # abre la ayuda de una función
help(mean)      # lo mismo que '?mean'
??"dplyr"      # búsqueda más amplia en toda la documentación

Ayuda

Más funciones básicas y útiles

Aleatoriedad, ordenar, contar…

x <- rpois(8, 8)
x
[1]  7  4  5  7  8 14  6  8
sample(x, 3)          # elegir 3 elementos al azar
[1] 5 6 7
rev(x)                # invertir el orden
[1]  8  6 14  8  7  5  4  7
sort(x)               # ordenar valores
[1]  4  5  6  7  7  8  8 14
length(x)             # longitud del vector
[1] 8

Conteos y valores únicos

table(x)              # tabla de frecuencias
x
 4  5  6  7  8 14 
 1  1  1  2  2  1 
unique(x)             # valores únicos
[1]  7  4  5  8 14  6
length(unique(x))     # cuántos valores distintos
[1] 6

Más funciones básicas y útiles

Raiz cuadrada, logaritmo, etc

log(x)       # logaritmo natural
[1] 1.945910 1.386294 1.609438 1.945910 2.079442 2.639057 1.791759 2.079442
sqrt(x)      # raíz cuadrada
[1] 2.645751 2.000000 2.236068 2.645751 2.828427 3.741657 2.449490 2.828427
log10(x)     # logaritmo en base 10
[1] 0.8450980 0.6020600 0.6989700 0.8450980 0.9030900 1.1461280 0.7781513
[8] 0.9030900
abs(-0.23)   # Valores absolutos
[1] 0.23
round(0.1245, 2)     # redondear a 2 decimales
[1] 0.12

Generadores de distribuciones

R es muy potente generando distribuciones con funciones ya integradas.

  • runif () - uniforme
  • rnorm () - normal
  • rpois () - poisson
  • rbinom () - binomial negativa

Una distribución describe cómo se reparten los valores de una variable, cómo de frecuentes son.

Distribución uniforme

Números al azar → todos con la misma probabilidad

# Un vector de 5 números aleatorios con distribución uniforme
runif(5)
[1] 0.9020167 0.8105354 0.3719038 0.5810635 0.2167433
# 100 valores del 0 al 100
x <- runif(1000, min = 0, max = 100)
hist(x, col = "orange")

Distribución normal

Peso de personas → muchas alrededor del promedio (forma de campana)

# 4 números con una distribución normal
rnorm(4)
[1] -0.65464496  0.09197797  0.20428282  1.36278189
# Especificando la media y la desviación
x <- rnorm(1000, mean = 50, sd = 10)
hist(x, col = "skyblue")

Distribución poisson

Datos de conteo → número de especies

# Generar 5 observaciones con media (λ) = 3
rpois(5, lambda = 3)
[1] 4 1 1 3 2
x <- rpois(1000, lambda = 3)
hist(x, col = "lightgreen")

Distribución binomial negativa

Resultados de “éxito o fracaso” (como lanzar una moneda)

# Binomial
# 20 experimentos, en cada uno lanzamos una monedas, con una probabilidad de que salga cara del 50%
caras <- rbinom(200, size = 1, prob = 0.5)
table(caras)
caras
  0   1 
113  87 
barplot(table(caras), col = "steelblue")

Caracteres y strings

R trabaja muy bien con cadenas de texto (strings)

un_nombre <- "Laura" # caracter
nombres <- c("Laura", "Rocio", "Violeta", "Rocio", "Rocio") # string
unique (nombres)
[1] "Laura"   "Rocio"   "Violeta"
table (nombres)
nombres
  Laura   Rocio Violeta 
      1       3       1 
rep (nombres, 5)    # repetir algo varias veces
 [1] "Laura"   "Rocio"   "Violeta" "Rocio"   "Rocio"   "Laura"   "Rocio"  
 [8] "Violeta" "Rocio"   "Rocio"   "Laura"   "Rocio"   "Violeta" "Rocio"  
[15] "Rocio"   "Laura"   "Rocio"   "Violeta" "Rocio"   "Rocio"   "Laura"  
[22] "Rocio"   "Violeta" "Rocio"   "Rocio"  
sample (nombres, 3, replace=TRUE) 
[1] "Rocio"   "Rocio"   "Violeta"

Caracteres y strings

Operaciones lógicas

nombres
[1] "Laura"   "Rocio"   "Violeta" "Rocio"   "Rocio"  
#¿existe Laura? ¿Hay algo que sea igual a Laura?
nombres == "Laura" 
[1]  TRUE FALSE FALSE FALSE FALSE
# ¿Hay algo que sea desigual a Laura?
nombres != "Laura"
[1] FALSE  TRUE  TRUE  TRUE  TRUE
# ¿Está incluído dentro de un vector de dos nombres?
nombres == c("Laura", "Rocio") #nope
[1]  TRUE  TRUE FALSE  TRUE FALSE
nombres %in% c("Laura", "Rocio") #yes
[1]  TRUE  TRUE FALSE  TRUE  TRUE

El operador %in% se usa para comprobar si los elementos de un vector están contenidos en otro vector

Ejercicios

  1. Calcula el minimo valor de 100 valores aleatorios según una distribución normal

  2. Dada una secuencia de 20 números seguidos (del 0 al 20), genera los pares y guárdalo en un objeto.

  • Crea un vector con 20 números aleatorios entre 0 y 50.
  • Calcula el promedio y la desviación estándar.
  • Multiplica todos los valores por 2.
  • Dibuja un histograma.
  • ¿Cómo cambia el promedio después de multiplicar por 2?
  1. Crea un vector con edades y usa una comparación para saber cuáles son mayores de edad y cualcula cuantos no lo son

Resolvemos

  1. Calcula el minimo valor de 100 valores aleatorios según una distribución normal
min (rnorm (100))
[1] -2.589161
  1. Dada una secuencia de 20 números seguidos (del 0 al 20), genera los pares y guárdalo en un objeto.
pares <- seq (0, 20, 2)
  1. Ejercicio
mi_vector <- runif(20,0,50)
mean (mi_vector)
[1] 21.87936
sd (mi_vector)
[1] 14.30595
mi_vector_2 <- mi_vector*2
hist(mi_vector_2)
  1. Crea un vector con edades y usa una comparación para saber cuáles son mayores de edad y cualcula cuantos no lo son
edades <- c(12, 18, 3, 44, 25, 15, 30)
sum (edades > 18)
[1] 3

Funciones propias

Sirven para ejecutar una tarea compleja y personalizada

  • Toma entradas (argumentos)
  • Devuelve salidas (resultados)
  • Sirve para organizar y simplificar el código

Ventaja ante la complejidad: se puede reutilizar!!

Ejemplo de funciones

Creamos nuestras propias funciones con function ()
Muchas ejecuciones (i.e. tareas) distintas para un mismo vector.

# Queremos la media de nuestros números  y la media de estos transformados a logaritmo
vector <- seq(1, 100, 10)
mean (log (vector))
[1] 3.380067
# Queremos la desviación estándar de nuestros números y de éstos transformados a log
vector2 <- seq(1, 300, 50)
sd (log (vector2))
[1] 2.069674
# Una función que hace todo eso a la vez y más cosas
mi_funcion_increible <- function (y) {
  mean <- mean (y)
  mean_log <- mean (log (y+1))
  sd <- sd (y)
  sd_log <- sd (log (y+1))
  return (c(mean, mean_log, sd, sd_log))
}

vector3 <- sample (40)
mi_funcion_increible (vector3)
[1] 20.5000000  2.8508553 11.6904519  0.7631147
mi_vector_increible <- mi_funcion_increible
mi_vector_increible
function (y) 
{
    mean <- mean(y)
    mean_log <- mean(log(y + 1))
    sd <- sd(y)
    sd_log <- sd(log(y + 1))
    return(c(mean, mean_log, sd, sd_log))
}
vector4 <- sample (100)
mi_funcion_increible (vector4)
[1] 50.5000000  3.6835450 29.0114920  0.8574057

Bucles

  • Distintos a las funciones. Se usa la función for()
  • Un bucle (loop) sirve para repetir una acción varias veces.
  • A cada repetición se le llama iteración
  • Se usa cuando quieres hacer lo mismo para muchos elementos (e.g. recorrer filas, listas o vectores).
# A mano del 1 al 5 está bien... pero del 1 al 100?
for (i in 1:5) {
  print(paste("Aquí está el número", i))
}
[1] "Aquí está el número 1"
[1] "Aquí está el número 2"
[1] "Aquí está el número 3"
[1] "Aquí está el número 4"
[1] "Aquí está el número 5"
valores <- c(10, 20, 30, 40)

for (v in valores) {
  print(mean(log(v + 1)))
}
[1] 2.397895
[1] 3.044522
[1] 3.433987
[1] 3.713572

la iteración puede ser por string

nombres <- c ("Laura", "Rocio", "Violeta")

length(nombres) # número de iteraciones 
[1] 3
for (i in nombres) {
  print(paste("Aquí está la alumna", i))
}
[1] "Aquí está la alumna Laura"
[1] "Aquí está la alumna Rocio"
[1] "Aquí está la alumna Violeta"

Bucles II 🎲

Imaginemos que queremos tirar un dado

# un dado 🎲
sample(1:6, 1)
[1] 4

Queremos repetir la función anterior 100 veces (tirar el dado 100 veces)
🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲 x 100

# Hay que generar un objeto vacío

tiro <- c()

for (i in 1:100) {
  tiro[[i]] <- sample(1:6, 1)
}

unlist(tiro)
  [1] 4 5 6 3 4 5 1 5 6 4 1 1 2 2 3 5 3 5 3 4 1 6 1 6 4 3 1 1 1 6 3 5 6 5 4 5 2
 [38] 4 3 2 2 5 3 3 6 3 5 1 3 2 6 2 6 5 1 4 2 6 2 4 3 1 2 1 3 2 5 1 6 3 6 4 1 2
 [75] 1 5 5 3 4 2 3 4 1 3 6 2 1 1 1 3 4 2 3 3 3 1 5 5 5 1
  1. Ejercicio rápido: ¿cómo podemos saber cuantas veces ha salido el numero 2?

Resolvemos

  1. Ejercicio rápido: ¿cómo podemos saber cuantas veces ha salido el numero 2?
sum (tiro == 2)
[1] 15

Ejercicio bucle

General 50 valores aleatorios generados a partir de una distribucion normal y calcula 100 medias, una para cada aleatorización con un bucle.

Ejercicio bucle

General 50 valores aleatorios generados a partir de una distribucion normal y calcula 100 medias, una para cada aleatorización con un bucle.

# Crear un vector vacío

filas <- c()

for (i in 1:100) {
  filas[[i]] <- mean (rnorm (50))
}

unlist(filas)
  [1]  0.125260347 -0.485054059  0.052244577 -0.046347701 -0.206773334
  [6]  0.165357029  0.039100152  0.208430778 -0.040967762  0.169776202
 [11]  0.116179589 -0.158103722  0.182790119 -0.171861680  0.015097842
 [16]  0.325699722 -0.062207711 -0.295187166  0.132316228 -0.035288273
 [21] -0.138424037  0.094762309 -0.111751341 -0.145648359 -0.074107753
 [26] -0.239520092 -0.033240928  0.105414240 -0.038168086  0.237566994
 [31] -0.253215067  0.201794708  0.130704824 -0.013216256 -0.074139371
 [36]  0.223425498  0.020102465 -0.108373758 -0.162349415  0.068190210
 [41] -0.265313881 -0.008413901  0.102352238 -0.288438083  0.030627984
 [46]  0.120152881  0.121013271  0.059977854 -0.146284107 -0.093694755
 [51]  0.003480977 -0.006138359  0.196069451 -0.116816579 -0.050573551
 [56]  0.090083289 -0.125879199  0.093010912 -0.157271311 -0.006973322
 [61]  0.101793562  0.126975425 -0.119760470 -0.138078501  0.056509953
 [66]  0.099957869 -0.071030599  0.050073243 -0.100380928 -0.144252669
 [71] -0.101308372 -0.123781975  0.127710640 -0.066020025  0.019232855
 [76] -0.261034028 -0.005125551  0.201071826  0.004619702  0.030785949
 [81]  0.045481891  0.036139681 -0.283476610  0.160682817 -0.061506141
 [86] -0.016283603  0.246216790 -0.060449475  0.097389575  0.023529368
 [91] -0.002750342 -0.013237041 -0.220546149  0.089764143  0.064047747
 [96] -0.075101594 -0.024116631  0.036136869 -0.279966885  0.074775093

Bucles III

Guardamos en un objeto las iteraciones

# Creamos un dataframe vacío
tabla <- data.frame(numero = numeric(),
                    cuadrado = numeric())
tabla
[1] numero   cuadrado
<0 rows> (or 0-length row.names)
# Creamos un bucle que vaya llenando las filas y columnas con cada i
for (i in 1:5) {
  nueva_fila <- data.frame(numero = i, cuadrado = i^2)
  tabla <- rbind(tabla, nueva_fila)
}

tabla
  numero cuadrado
1      1        1
2      2        4
3      3        9
4      4       16
5      5       25

Bucles con ‘apply’, ‘sapply’, ‘lapply’

Otra forma de hacer bucles, pero en la misma linea

sapply(vectores, function(i) mean(log(i + 1)))

Condicionantes con ‘ifelse’

  • if (): R ejecuta el código dentro del bloque {} solo si la condición es verdadera.
  • if else (): si no se cumple la condición, haz esto otro
  • ifelse (): en una linea
x <- 10

if (x > 5) {
  print("El número es mayor que 5")
}
[1] "El número es mayor que 5"
x <- 3

if (x > 5) {
  print("El número es mayor que 5")
} else {
  print("El número es menor o igual que 5")
}
[1] "El número es menor o igual que 5"
edades <- c(15, 22, 35, 12)
ifelse (edades >= 18, "Adulto", "Menor")
[1] "Menor"  "Adulto" "Adulto" "Menor" 

Ejercicios

  • Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”, según tu termostato personal

  • Opcional (y difícil). Haz una función que diga si un número cualquiera es par o no

Resolvemos

  • Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”, según tu termostato personal

  • Haz una función que diga si un número cualquiera es par o no

temperaturas <- rpois (10, 15)
clasificacion <- ifelse(temperaturas < 15, "frio", "caliente")
data.frame (temperaturas, clasificacion)
   temperaturas clasificacion
1            18      caliente
2            19      caliente
3            16      caliente
4            16      caliente
5            13          frio
6            16      caliente
7            17      caliente
8            16      caliente
9            12          frio
10           18      caliente
que_tipo_de_numero_soy <- function (x) {
ifelse(x %% 2 == 0, "par", "impar")
}

que_tipo_de_numero_soy(2)
[1] "par"
que_tipo_de_numero_soy(33)
[1] "impar"

Bases de datos

Una base de datos (data frame) es una tabla de datos, como una hoja de cálculo en excel, tiene filas (observaciones) y columnas (variables).

# Creamos vectores con información
nombres <-  c ("Laura", "Rocio", "Violeta")
edad <- c(23, 35, 29)
altura <- c(1.65, 1.80, 1.70)
profesion <- c("Bióloga", "Informática", "Médica")

# Combinamos todo en un data frame
personas <- data.frame(
  NAME = nombres,
  AGE = edad,
  HEIGHT = altura,
  JOB = profesion)

personas
     NAME AGE HEIGHT         JOB
1   Laura  23   1.65     Bióloga
2   Rocio  35   1.80 Informática
3 Violeta  29   1.70      Médica

Seleccionar con R base

Seleccionamos filas, columnas sobre la base de datos

objeto[filas,columnas]

personas[1,] # FILAS
   NAME AGE HEIGHT     JOB
1 Laura  23   1.65 Bióloga
personas[,1] # COLUMNAS
[1] "Laura"   "Rocio"   "Violeta"
personas$NAME # Seleccionar columnas directamente con $
[1] "Laura"   "Rocio"   "Violeta"
# head(personas)       
# str(personas)  
# summary(personas) 
# colnames(personas) 
# nrow(personas)  
# ncol(personas)
# View(personas) se abre en RStudio como una tabla interactiva.
# write_csv(personas, "data/personas.csv")

tabla vista en R (View)

Leer bases de datos

🙏 Organiza correctamente tus carpetas 🙏

/ para indicar un nivel más dentro de la carpeta

En la práctica, los datos vienen en archivos externos: CSV, Excel, TXT, u online.
El formato .csv (comma separated values) es el más común. Cada columna está separada por una coma o punto y coma.

Leer bases de datos

here () nos lleva a donde tengamos el archivo del script guardado

library(here)

# dir()
# getwd ()
# setwd ()

# CSV
datos_csv <- read.csv(here("data/personas.csv"))
head(datos_csv)
     NAME AGE HEIGHT       JOB
1   Laura  23   1.65   Bióloga
2   Rocio  35   1.80 Profesora
3 Violeta  29   1.70    Médica
# EXCEL
library(readxl)
datos_excel <- read_excel(here("data/herbarium_df.xlsx")) #, sheet = 1 podríamos especificar el numero de hoja

# GOOGLE SHEETS
library(googlesheets4)
datos_gs <- read_sheet("https://docs.google.com/spreadsheets/d/1qC4lsXPpEcX1NmLdwiMJMC8X_WKX-EFQm4ahPdrNCZc/edit?usp=sharing")

Guardar bases de datos

write.xlsx (datos_gs, "data/datos_gs.xlsx")
write_csv (datos_gs, "data/datos_gs.csv")
fwrite (datos_gs, "data/datos_gs.csv")

Ejercicio

Base de datos de flores: Por cada sitio y trampa, tenemos el numero de flores que tienen las especies de plantas en Doñana.

Ejercicio: Importa la base de datos “flores.csv” de la carpeta “data”, explora la base de datos, calcula la abundancia media de flores total, indica cuantas especies distintas hay de plantas. Luego, crea una base de datos con el número de individuos por especie (no de flores). Guardala como csv.

Resolvemos

flores <- read.csv(here("data/flores.csv"))
str(flores) # exploramos
'data.frame':   490 obs. of  5 variables:
 $ code     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ site_id  : chr  "ANZ_1" "ANZ_1" "ANZ_1" "ANZ_1" ...
 $ pantrap  : int  1 1 1 2 2 2 2 3 3 4 ...
 $ species  : chr  "Oxalis pes-caprae" "Cistus salvifolius" "Ornithogalum umbellatum" "Cistus salvifolius" ...
 $ abundance: int  3 16 4 2 3 4 1 3 1 8 ...
mean(flores$abundance) # media
[1] 16.45102
length(unique(flores$species)) # cuantas especies hay
[1] 74
# table(flores$species) # cuantas flores por especie
flores_sum <- data.frame(table(flores$species)) # número de individuos por especie
# write_csv (flores_sum, "data/flores_sum.csv")

Buenas prácticas de sintaxis en R

Espacios y asignaciones

  • Usa espacios alrededor de los operadores, usa <- en vez de =
  • Funciones con el mismo nombre, especifica el paquete (dplyr::select ())
  • Empieza tu script con una descripción sobre lo que hace el código, autorx, fecha y sesión.

Registro y reproducibilidad

  • Realiza todas las manipulaciones de datos mediante código, no manualmente
  • Así dejas rastro reproducible de cada cambio
  • Guarda o exporta tus datos en formatos de texto plano (.csv, .txt)

🙏 cómo organizar tus carpetas🙏

Código limpio

  • Comentarios útiles
  • Divide en pasos lógicos
  • Usa bien la sangría y los espacios
  • Usa bien los nombres
  • Guarda solo objetos útiles (R se va llenando)
  • Guarda una carpeta con los datos brutos

Tips

  • control + shift + C (des)comenta todo a la vez ##
  • control + shift + A reformatea el código
  • control + click se abre la tabla en RStudio

Objetos

  • Siempre empiezan por una letra y son sensibles a mayusculas
  • Deberían llevar nombres coherentes y un orden
yo_uso_la_serpiente <- 10
OtraGenteUsaElCamello <- 9
otra.gente.usa.los.puntos <- 9
Hayque_evitar.esto10 <- 2

Compartir código

  • git. Es una herramienta de control de versiones que además permite trabajar en equipo
  • GitHub (portfolio de programador) Perfil

Escribir textos, informes, artículos

  • Quarto
  • Rmarkdown
  • Ciencia reproducible y limpia